Crate core_extensions
source · [−]Expand description
Extension traits for many standard/core library types/traits. and other miscelaneuous types / traits / functions / macros.
Adding as dependency
This crate requires cargo features for enabling items, to get all of them you can use:
[dependencies.core_extensions]
version = "1.5"
features = [
# enables items that use anything from the standard `std` or `alloc` crates.
"std",
# Requires the latest stable release, enables all the rust-version-dependent features
"rust_latest_stable",
# enables all the item features
"all_items",
]
The "std"
feature is required to enable impls and items that use std
types,
otherwise only the core
library is supported.
"rust_latest_stable"
enables all the "rust_1_*"
crate features
to use the newest stable language features,
here’s a list of all the "rust_1_*"
features,
"all_items"
enables all of the features for enabling items from this crate
(documented here):
Here is the expanded version of the above configuration:
[dependencies.core_extensions]
version = "1.5"
features = [
"std",
"rust_latest_stable"
# all of the features below are what "all_items" enables
"derive"
"bools",
"callable",
"collections",
"const_default",
"const_val",
"generics_parsing",
"integers",
"item_parsing",
"iterators",
"macro_utils",
"marker_type",
"on_drop",
"option_result",
"phantom",
"self_ops",
"slices",
"strings",
"transparent_newtype",
"type_asserts",
"type_identity",
"type_level_bool",
"void",
]
Examples
Showcasing some features from this crate.
quasiconst
, generic constants.
The quasiconst
macro allows emulating generic constants by generating a
zero-sized generic type that implements the ConstVal
trait,
the preferred way to get its value is the getconst
macro.
This example demonstrates how you can use them to declare a generic VTABLE constant.
use core_extensions::{getconst, quasiconst};
use std::fmt::{self, Debug};
quasiconst!{
pub const VTABLE<T: Debug>: &'static Vtable = &Vtable {
size: std::mem::size_of::<T>(),
align: std::mem::align_of::<T>(),
drop: drop_erased::<T>,
fmt: debug_fmt_erased::<T>,
};
}
const VTABLE_U8: &'static Vtable = getconst!(VTABLE<u8>);
assert_eq!(VTABLE_U8.size, 1);
assert_eq!(VTABLE_U8.align, 1);
const VTABLE_USIZE: &'static Vtable = getconst!(VTABLE<usize>);
assert_eq!(VTABLE_USIZE.size, std::mem::size_of::<usize>());
assert_eq!(VTABLE_USIZE.align, std::mem::align_of::<usize>());
const VTABLE_STRING: &'static Vtable = getconst!(VTABLE<&str>);
assert_eq!(VTABLE_STRING.size, std::mem::size_of::<usize>() * 2);
assert_eq!(VTABLE_STRING.align, std::mem::align_of::<usize>());
pub struct Vtable {
pub size: usize,
pub align: usize,
pub drop: unsafe fn(*mut ()),
pub fmt: unsafe fn(*const (), &mut fmt::Formatter<'_>) -> fmt::Result,
}
unsafe fn drop_erased<T>(ptr: *mut ()) {
std::ptr::drop_in_place(ptr as *mut T)
}
unsafe fn debug_fmt_erased<T>(ptr: *const (), f: &mut fmt::Formatter<'_>) -> fmt::Result
where
T: Debug,
{
let this = unsafe{ &*(ptr as *const T) };
Debug::fmt(this, f)
}
Cargo Features
Item features
Item features enables items from this crate.
The "all_items"
feature enables all of these features,
you can use it instead of the ones below if you don’t mind longer compile-times.
The "all_items_no_derive"
feature eanbles all the features below
except for the "derive"
feature,
to reduce compile-times due to enabling the syn
indirect dependency.
-
"derive"
: Enables derive macros for traits declared in core_extensions. If a trait has a derive macro it’ll mention and link to it. -
"bools"
: Enables theBoolExt
trait, extension trait forbool
. -
"callable"
: Enables thecallable
module, with stably implementable equivalents of theFn*
traits. -
"collections"
: Enables thecollections
module, with traits for collection types. -
"const_default"
: Enables theConstDefault
trait, andconst_default
macro, for aconst
equivalent of theDefault
trait. -
"const_val"
: Enables theConstVal
trait (for types that represent constants),getconst
macro (for getting theConstVal::VAL
associated constant), andquasiconst
macro (for declaring types that emulate generic constants). Enables the"generics_parsing"
feature. -
"macro_utils
: Enables therewrap_macro_parameters
,count_tts
,gen_ident_range
,tokens_method
,compile_error_stringify
, andparenthesize_args
macro. Also enables themacro_attr
attribute. -
"generics_parsing"
: Enables theparse_generics
,parse_generics_and_where
,split_generics_and_where
,parse_split_generics
, andparse_split_generics_and_where
macros. These allow macros to parse items with generic parameters. -
"item_parsing"
: Enables the"macro_utils
and"generics_parsing"
features. Enables theimpl_parse_generics
andimpl_split
macros. -
"integers"
: Enables theintegers
module, with extension traits for integer types. -
"iterators"
: Enables theiterators
module, with theIteratorExt
extension trait for iterators, and a few iterator types. -
"marker_type"
: Enables theMarkerType
trait, for trivially constructible, zero-sized, and aligned-to-1 types. -
"on_drop"
: Enables theRunOnDrop
type, a wrapper type that runs a closure at the end of the scope. -
"option_result"
: Enables theoption_result_ext
module, with traits forOption
andResult
-like types. -
"phantom"
: Enables thephantom
module(withPhantomData
-related items),expr_as_phantom
macro,map_phantomdata
macro, andreturn_type_phantom
macro. -
"self_ops"
: Enables theSelfOps
trait, an extension trait for all types. It primarily has methods for calling free functions as methods. -
"slices"
: Enables theslices
module, with extension traits for[T]
andstr
slices. -
"strings"
: Enables thestrings
module, with theStringExt
extension trait for strings. -
"transparent_newtype"
: Enables thetransparent_newtype
module, with extension traits and functions for#[repr(transparent)]
newtypes with public fields.
Enables the"marker_type"
feature. -
"type_asserts"
: Enables thetype_asserts
module, with type-level assertiosn, most useful in tests. -
"type_identity"
: Enables theTypeIdentity
trait, for proving that two types are equal, and converting between them in a generic context. -
"type_level_bool"
: Enables thetype_level_bool
module, which encodesbool
s on the type-level. -
"void"
: Enables theVoid
type, a type that can’t be constructed, for encodign impossible situations.
Rust Version numbers
These features enable code that require some Rust version past the minimum supported one:
-
“rust_1_46”: Makes
TransparentNewtype
andTypeIdentity
associated functions that takeRc<Self>
orArc<Self>
callable as methods. -
“rust_1_51”: Enables the “rust_1_46” feature, and impls of traits for all array lengths. Enables the
"on_drop"
feature becauseRunOnDrop
is used by the impls for arrays of all lengths. -
“rust_latest_stable”: Enables all the “rust_1_*” features. This requires the last stable release of Rust, since more
"rust_1_*"
features can be added at any time.
Support for other crates
All of these are disabled by default:
-
"std"
: Enablesstd
library support. Implies the"alloc"
feature. -
"alloc"
: Enablesalloc
library support. -
"serde_"
: Enables serde support.
Miscelaneous features
"track_caller"
:
Enables the “rust_1_46” feature.
Changes ResultLike
to allow getting the caller location in ResultLike::into_result_
,
and makes IsNoneError
store where it was constructed.
"docsrs"
: Used to document the required features in docs.rs, requires Rust nightly.
Doesn’t enable any items itself.
no-std support
This crate works in #![no_std]
contexts by default.
Supported Rust versions
This crate support Rust back to 1.41.0, requiring cargo features to use language features from newer versions.
Re-exports
pub use self::callable::CallExt;
pub use self::callable::CallInto;
pub use self::callable::CallMut;
pub use self::callable::CallRef;
pub use self::integers::IntegerExt;
pub use self::integers::ToTime;
pub use self::iterators::IterCloner;
pub use self::iterators::IterConstructor;
pub use self::iterators::IteratorExt;
pub use self::iterators::LazyOnce;
pub use self::option_result_ext::OptionExt;
pub use self::option_result_ext::ResultExt;
pub use self::option_result_ext::ResultLike;
pub use self::option_result_ext::ResultLikeExt;
pub use self::option_result_ext::TransposeOption;
pub use self::phantom::AsPhantomData;
pub use self::phantom::AndPhantom;
pub use self::phantom::AndPhantomCov;
pub use self::phantom::as_phantom;
pub use self::phantom::as_covariant_phantom;
pub use self::phantom::ContraVariantPhantom;
pub use self::phantom::InvariantPhantom;
pub use self::phantom::InvariantRefPhantom;
pub use self::phantom::VariantDropPhantom;
pub use self::phantom::CovariantPhantom;
pub use self::strings::StringExt;
pub use self::slices::ValSliceExt;
pub use self::slices::SliceExt;
pub use self::transparent_newtype::TransparentNewtype;
pub use self::transparent_newtype::TransparentNewtypeExt;
Modules
collections
Extension traits for collection types.
integers
Extension traits for integers and types used in the traits.
iterators
Iterator adaptors and constructors.
Time measurement.
option_result
Contains extension traits for Option and Result
phantom
PhantomData
-related items.
slices
Slice extension traits, and related items.
slices
Extension trait for string types.
transparent_newtype
Traits for newtype wrappers.
type_asserts
Type-level assertions, most useful for tests.
type_level_bool
Type level booleans
Miscelaneous utility functions
Macros
macro_utils
Stringifies the input tokens, and errors with compile_error
.
const_default
Gets the ConstDefault::DEFAULT
associated constant for a type.
macro_utils
Counts the amount of token trees passed to this macro, passing the amount to an (optional) callback macro.
transparent_newtype
For delegating the implementation of the TransparentNewtype
trait to a field.
phantom
Gets the type of an expression as a PhantomData
, without evaluating the expression.
macro_utils
Generates identifiers. passing them to a callback macro.
const_val
Gets the ConstVal::VAL
associated constant for a type.
callable
item_parsing
For parsing impl blocks, transforming the generic parameters to a form easily parsable by the callback macro.
item_parsing
For parsing impl blocks, passing the generic parameters unchanged to a callback macro.
transparent_newtype
For implementing the TransparentNewtype
trait,
to cast between a field and Self
.
iterators
Use this macro to create an
IterCloner
from an IntoIterator
(this includes all Iterator
s).
phantom
Maps a PhantomData<T>
to a PhantomData<U>
by using a FnOnce(T) -> U
closure.
Evaluates to true if the expression matches any of the patterns (this macro can have multiple patterns).
macro_utils
Adaptor macro which passes arguments to a callback macro, wrapping them in parentheses.
generics_parsing
Transforms generic parameters for use in type definitions, impl blocks and generic arguments, passing them to a callback macro.
generics_parsing
For writing macros that parse item definitions, with the generic parameters transformed for use in type definitions, impl blocks and generic arguments.
generics_parsing
Transforms generic parameters to a form easily parsable by a callback macro.
generics_parsing
For parsing item definitions, transforming generics to a form easily parsable by a callback macro.
const_val
Declare types that emulate generic constants.
phantom
Gets the return type of a parameterless closure as a PhantomData
macro_utils
Rewraps the tokens inside macro parameters into parentheses.
generics_parsing
For parsing item definitions, passing the generic parameters unchanged to a callback macro.
macro_utils
Does slice and iterator operations on tokens, passing the result to a callback macro.
Structs
on_drop
A wrapper type that runs a closure at the end of the scope.
Enums
void
Type for impossible situations.
Traits
bools
Extension trait for bool
.
const_default
A const equivalent of the Default
trait.
const_val
For types that represent constants.
marker_type
Represents a zero-sized marker type .
self_ops
Extension trait for every type.
type_identity
Allows converting Self
to
Self::Type
by proving that both types are equal.
Type Definitions
type_identity
A type-level identity function
Attribute Macros
macro_utils
For using function-like macros as attributes.
Derive Macros
derive
and const_default
Derives the ConstDefault
trait for structs and enums.
derive
and transparent_newtype
Derives the TransparentNewtype
trait.